package com.flyqiu.common.sc.calculate;

import com.flyqiu.common.sc.FlyQiuSCContext;
import com.flyqiu.common.sc.statistical.IFlyQiuStatistical;

/**
 * FlyQiu计算接口，用于定义计算的规则和方法
 *
 * @param <T> 泛型参数，表示计算过程中操作的值的类型
 */
public interface FlyQiuCalculate<T> {

    /**
     * 获取默认值
     *
     * @return 默认值
     */
    T getDefVal();

    /**
     * 计算类型
     *
     * @return 计算类型的字符串表示
     */
    String calculateType();

    /**
     * 转换值
     *
     * @param value 需要转换的值
     * @return 转换后的值
     */
    T convert(Object value);

    /**
     * 获取计算值的类类型
     *
     * @return 计算值的类类型
     */
    Class<T> getCalculateValueClazz();

    /**
     * 执行计算
     *
     * @param context 上下文环境，携带计算所需的信息
     * @param cur     当前值，用于计算的当前状态值
     */
    void calculate(FlyQiuSCContext<?> context, T cur);

    /**
     * 重置计算
     *
     * 重置计算的相关状态或值，以便重新进行计算
     */
    void restCalculate();

    /**
     * 获取计算值
     *
     * @param context 上下文环境，用于获取计算所需的统计信息
     * @return 计算的值
     */
    T getValue(IFlyQiuStatistical<?> context);
}
